package com.qianxun.init.properties;

import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.LinkedHashMap;
import java.util.List;

/**
 * shiro配置属性
 * @author: huwei
 * @date:   2019/9/18 15:09
 * @version:  1.0.0
*/
@Data
@Component
@ConfigurationProperties(prefix = "shiro")
public class ShiroProperties {
    /**
     * 全局的登录页，当请求资源没有在loginUrlList中设定专属登录页时，默认走该页面
     */
    private String loginUrl;
    /**
     * 全局的成功登录页的url，当请求资源没有在loginUrlList中设定专属登录成功页时，默认走该页面
     */
    private String successUrl;
    /**
     * 请求资源被禁用时的提示页面
     */
    private String disableUrl;
    /**
     * 访问被拒绝时的提示页面
     */
    private String accessDeniedUrl;

    /**
     * 专属登录相关页设置，
     */
    private List<LoginUrlConfig> loginUrlConfigList;
    /**
     * url过滤配置设置
     */
    private List<UrlFilterConfig> urlFilterConfigList;

    public LinkedHashMap<String ,String> urlFilter(){
        LinkedHashMap<String ,String> urlFilterMap = new LinkedHashMap<>(16);
        if(urlFilterConfigList != null){
            urlFilterConfigList.forEach(urlFilterConfig -> {
                urlFilterMap.put(urlFilterConfig.getMatchUrl() ,urlFilterConfig.getFilter());
            });
        }
        return urlFilterMap;
    }

    @Data
    @Accessors(chain = true)
    public static class LoginUrlConfig {
        /**
         * 请求url与matchUrl匹配时，且请求url需要权限认证，则跳转到当前loginUrl
         * 支持正则表达式
         */
        private String matchUrl;
        /**
         * 跳转的登录页面
         */
        private String loginUrl;
    }

    /**
     *
     * @author: huwei
     * @date:   2019/11/28 11:31
     * @version:  1.0.0
    */
    @Data
    @Accessors
    public static class UrlFilterConfig{
        /**
         * url拦截地址
         * 支持正则表达式
         */
        private String matchUrl;
        /**
         * shiro中可用filter
         * shiro默认可用的filter如下：
         *# 默认过滤器
         * # filter的key值      指向filter类                                                  描述          示例：
         * # anon              org.apache.shiro.web.filter.authc.AnonymousFilter            不认证        /**=anon
         * # authc             org.apache.shiro.web.filter.authc.FormAuthenticationFilter   必须登录      /**=authc
         * # roles             org.apache.shiro.web.filter.authc.RolesAuthenticationFilter  角色判断，多个参数必须加引号且用逗号分割； /**=roles["admin,user"]
         */
        private String filter;
    }
}
